let impl = Symbol('impl');
let top = Symbol('top');

/**
 * 工具箱接口
 * @interface
 */
class ITool {
  constructor(_top, _impl) {
    this[top] = _top;
    this[impl] = _impl;
    this.useDefaultComponent = true;
    // 工具内图层ID的前缀
    this.layeridPrefix = '';
    this.eventEmitter = _top.eventEmitter;
  }

  /**
   * 获取地图开放顶层
   */
  getTop() {
    return this[top];
  }

  /**
   * 获取地图实例
   */
  getImpl() {
    return this[impl];
  }

  /**
   * 获取地图对象
   */
  getMap() {
    return this[impl].map;
  }

  /**
   * 获取工具箱
   * @param {String} toolname 工具箱名称
   */
  getTool(toolname) {
    return this[top].tools[toolname];
  }

  /**
   * 获取工具类
   * @param {String} utilname 工具类名称
   */
  getUtil(utilname) {
    return this[top].utils[utilname];
  }

  /**
   * 获取服务接口
   */
  getApi() {
    return this[top].api;
  }

  /**
   * 获取参数配置
   */
  getConfig() {
    return this[top].config;
  }

  /**
   * 获取事件总线
   */
  getEventBus() {
    return this[impl].eventBus;
  }

  /**
   * 初始化时调用方法
   */
  onAdd() {}

  /**
   * 销毁时调用方法
   */
  onRemove() {}

  /**
   * 创建新工具箱
   * @param {*} Cls 工具
   */
  newInstance(Cls) {
    // 新实例不挂载在工具箱
    var tool = new Cls(this[top], this[impl]);
    tool.onAdd();
    return tool;
  }

  //※※※※※ 日志集成 ※※※※※//
  log() {
    this[top].utils.DebugUtil.log(...arguments);
  }
  info() {
    this[top].utils.DebugUtil.info(...arguments);
  }
  error() {
    this[top].utils.DebugUtil.error(...arguments);
  }

  setCurrentGridTool(tool) {
    this[top]._gridTool = tool;
  }
}

export default ITool;
